iT邦幫忙

2023 iThome 鐵人賽

0
Software Development

救救我啊我救我!CRUD 工程師的惡補日記系列 第 40

【MySQL】資料表、資料型態與欄位限制

  • 分享至 

  • xImage
  •  

關聯式資料庫不僅是大學資料庫課程的使用對象,也是業界的主流選擇。雖然也有非關聯式的(被稱為 NoSQL,如 MongoDB),然而根據筆者觀察,NoSQL 通常是職缺的加分項目,或者與關聯式的 SQL 同為必備項目。因此基本上還是要會 SQL,求職時才能有更多選擇。

接下來的幾篇文章,是筆者複習 MySQL 資料庫的筆記整理,方便日後查閱。也適合以前有學過 SQL,但太久未使用,現在只記得一點點,仍有些概念的讀者。

主要參考的學習資源為以下影片:


一、環境準備

(一)安裝 MySQL

我們透過 Docker 啟動 MySQL 的服務。

以下指令會下載 MySQL 8.2.0 版的映像檔,並建立名為「TestMySQL」的容器。而 root 使用者的密碼為「123456」。

docker run --name TestMySQL -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.2.0

(二)安裝 GUI 工具

為了方便撰寫與執行 SQL 指令,可安裝 GUI 工具,筆者使用「Workbench」。

在 SQL 指令撰寫視窗上方的按鈕中,閃電符號代表執行全部或是已反白的指令。閃電符號 + 鍵盤游標代表執行游標所在位置的指令。
mysql-workbench-sql-tab-indicate-execute.png
https://ithelp.ithome.com.tw/upload/images/20240116/20131107I5QrHreako.png

(三)建立資料庫

透過 Workbench 工具,可預先建立一個資料庫,如下圖。
mysql-workbench-create-schema.jpg
https://ithelp.ithome.com.tw/upload/images/20240116/20131107T44aS8c0Gy.jpg

而以下是相關的指令,假設資料庫名稱為「company」。

建立資料庫:

CREATE DATABASE `company`;

列出現有資料庫:

SHOW DATABASES;

指定使用資料庫,讓之後執行的指令都作用於它:

USE `company`;

二、資料型態

參考影片:
https://www.youtube.com/watch?v=bAwO9fvlEio

(一)數值

|| 型態 || 儲存空間 || 範圍(有符號) || 範圍(無符號) || 對應 Java 型態 ||
|-|-|-|-|-|
|TINYINT|1 byte|-128 ~ 127|0 ~ 255|byte|
|SMALLINT|2 bytes|-32768 ~ 32767|0 ~ 65535|short|
|INT / INTEGER|4 bytes|約正負 21.4 億|0 ~ 約 42.9 億|int|
|BIGINT|8 bytes|正負 2^63|0 ~ 2^64 - 1|long|
|DOUBLE|8 bytes|約正負 1.79E+308|約 2.22E-308 ~ 1.79E+308|double|
|DECIMAL|-|-|-|-|

其中 DECIMAL 比較特別,它具有「精度」(M)與「標度」(D)。宣告方式為 DECIMAL(M, D),M 代表該值有幾個數字,D 代表小數點占幾位。

(二)文字

|| 型態 || 占用空間(英、數、半形符號) || 占用空間(其他字) || 是否補空白 ||
|-|-|
|CHAR|1 byte|2 bytes|是|
|VARCHAR|1 byte|2 bytes|否|
|NCHAR|2 bytes|2 bytes|是|
|NVARCHAR|2 bytes|2 bytes|否|

宣告方式為 CHAR(2)NVARCHAR(300) 等,會定義位元數。

這四種型態,差別在於是否有「VAR」與「N」。前者代表變動長度,若無 VAR,則當資料未達該長度,會在後方填補半形空白。後者代表是否使用 Unicode 編碼。

固定長度的效能比變動長度來得好,因此如身分證字號、學生學號等固定長度的資料,可採用 CHAR 型態。而姓名、自我介紹等,可考慮 NVARCHAR 型態。

(三)日期時間

|| 型態 || 範圍 ||
|-|-|
|DATE|1000-01-01 ~ 9999-12-31|
|TIME|-838:59:59 ~ 838:59:59|
|YEAR|1901 ~ 2155|
|DATETIME|1000-01-01 00:00:00 ~ 9999-12-31 23:59:59|

三、資料表的設計

(一)建立與刪除

以下指令建立一個儲存員工資料的表,叫做「employee」。

CREATE TABLE `employee` (
	`emp_id` INT UNSIGNED,
    `name` NVARCHAR(50),
    `birthday` DATE,
    `gender` CHAR(1),
    `salary` INT UNSIGNED
);

若數值欄位已知不會出現負數,則可於型態後方加上 UNSIGNED,讓值的範圍往正方向平移,相當於正數範圍擴大一倍。

建立後,可確認資料表目前的設計。

DESC `employee`;

DESC 是描述(describe)的意思,指令亦可直接寫 DESCRIBE

而刪除資料表的指令如下。

DROP `employee`;

(二)欄位限制

建立資料表時,在資料型態後方可加上一些限制,確保不會存入不合理的資料。

CREATE TABLE `employee` (
	`emp_id` INT UNSIGNED AUTO_INCREMENT,
    `name` NVARCHAR(50) NOT NULL,
    `email` VARCHAR(50) NOT NULL UNIQUE,
    `on_board_date` DATE NOT NULL DEFAULT("1970-01-01"),
    `gender` CHAR(1) NOT NULL CHECK(`gender` IN ("M", "F")),
    `salary` INT UNSIGNED NOT NULL CHECK(`salary` >= 27000),
    `dept_id` INT UNSIGNED,
    PRIMARY KEY(`emp_id`)
);

以上添加了一些關鍵字。

  • PRIMARY KEY:設定主鍵,可給予一至多個欄位。
  • AUTO_INCREMENT:未來新增資料時,該欄位不必給值,直接讓 MySQL 由 1 開始遞增。
  • NOT NULL:必填欄位。
  • UNIQUE:規定資料表中,該欄位的值不可重複。
  • DEFAULT:設定預設值。亦可搭配函數,如 CURDATE()(今天日期)。
  • CHECK:規定欄位值需符合某些條件。寫法如同查詢時的 WHERE 條件子句。

四、增刪與修改欄位

假設員工資料表中還要有一個欄位,用來代表部門。現在我們有「branch_id」與「dept_id」這兩個名稱可選擇。

(一)新增

ALTER TABLE `employee` ADD COLUMN `dept_id` TINYINT;

(二)刪除

ALTER TABLE `employee` DROP COLUMN `dept_id`;

(三)改名

以下指令是將叫做「dept_id」的欄位,改名為「branch_id」。

ALTER TABLE `employee` RENAME COLUMN `dept_id` TO `branch_id`;

(四)改型態

以下指令是將叫做「branch_id」的欄位,更改資料型態為「INT」。

ALTER TABLE `employee` MODIFY COLUMN `branch_id` INT;

(五)改名兼改型態

以下指令是將叫做「branch_id」的欄位,改名為「dept_id」,且資料型態改為無號「TINYINT」。

ALTER TABLE `employee` CHANGE COLUMN `branch_id` `dept_id` TINYINT UNSIGNED;

今日文章到此結束!
最後宣傳一下自己的部落格,我是「新手工程師的程式教室」的作者,主要發表後端相關文章,請多指教/images/emoticon/emoticon41.gif


上一篇
【Docker】利用 Docker Compose 完成多容器部署(二)
下一篇
【MySQL】資料的增刪改查與條件撰寫
系列文
救救我啊我救我!CRUD 工程師的惡補日記50
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言